﻿#region "Imports"
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using Practico2.DataTypes;
using Practico2.Constants;
#endregion

namespace Practico2.DataAccess
{

    public class CiudadDataAccess
    {

        public static int InsertCiudad(DTCiudad toInsert)
        {
            int toReturn = 0;
            SqlTransaction transaction = TransactionManager.GetTransaction();
            SqlConnection connection = null;
            SqlDataReader reader = null;
            string insertCommandText = "INSERT INTO Ciudad([IdPais],[NombreCiudad],[LatitudCiudad],[LongitudCiudad],[DescripcionCiudad]) VALUES (@IdPais,@NombreCiudad,@LatitudCiudad,@LongitudCiudad,@DescripcionCiudad) ; SELECT @@Identity";
            bool useTransaction = (transaction != null);
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString" ].ConnectionString);
            }

            SqlCommand command;


            if (useTransaction)
            {
                command = new SqlCommand(insertCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(insertCommandText, connection);
            }

            if (toInsert.IsIdPaisNull)
            {
                command.Parameters.Add(new SqlParameter("@IdPais", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@IdPais", toInsert.IdPais));
            }
            if (toInsert.IsNombreCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@NombreCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@NombreCiudad", toInsert.NombreCiudad));
            }
            if (toInsert.IsLatitudCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@LatitudCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@LatitudCiudad", toInsert.LatitudCiudad));
            }
            if (toInsert.IsLongitudCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@LongitudCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@LongitudCiudad", toInsert.LongitudCiudad));
            }
            if (toInsert.IsDescripcionCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@DescripcionCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@DescripcionCiudad", toInsert.DescripcionCiudad));
            }

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }

                reader = command.ExecuteReader();
                reader.Read();
                toReturn = Convert.ToInt32(reader.GetValue(0));
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                if (reader != null && !reader.IsClosed)
                {
                    reader.Close();
                }

                if ((connection != null) && connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
            return toReturn;
        }

        public static void UpdateCiudad(DTCiudad toUpdate)
        {
            SqlTransaction transaction = TransactionManager.GetTransaction();
            SqlConnection connection = null;
            bool useTransaction = (transaction != null);
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString" ].ConnectionString);
            }
            string updateCommandText = "UPDATE Ciudad SET [IdPais]=@IdPais,[NombreCiudad]=@NombreCiudad,[LatitudCiudad]=@LatitudCiudad,[LongitudCiudad]=@LongitudCiudad,[DescripcionCiudad]=@DescripcionCiudad WHERE [IdCiudad]=@IdCiudad";

            SqlCommand command;
            if (useTransaction)
            {
                command = new SqlCommand(updateCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(updateCommandText, connection);
            }

            command.Parameters.Add(new SqlParameter("@IdCiudad", toUpdate.IdCiudad));

            if (toUpdate.IsIdPaisNull)
            {
                command.Parameters.Add(new SqlParameter("@IdPais", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@IdPais", toUpdate.IdPais));
            }
            if (toUpdate.IsNombreCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@NombreCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@NombreCiudad", toUpdate.NombreCiudad));
            }
            if (toUpdate.IsLatitudCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@LatitudCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@LatitudCiudad", toUpdate.LatitudCiudad));
            }
            if (toUpdate.IsLongitudCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@LongitudCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@LongitudCiudad", toUpdate.LongitudCiudad));
            }
            if (toUpdate.IsDescripcionCiudadNull)
            {
                command.Parameters.Add(new SqlParameter("@DescripcionCiudad", DBNull.Value));
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@DescripcionCiudad", toUpdate.DescripcionCiudad));
            }


            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                command.ExecuteNonQuery();

            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }

        }

        public static void DeleteCiudad(Int32 idCiudad)
        {

            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            string deleteCommandText = "DELETE FROM Ciudad WHERE [IdCiudad]=@IdCiudad";

            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString" ].ConnectionString);
            }

            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(deleteCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(deleteCommandText, connection);
            }

            command.Parameters.Add(new SqlParameter("@IdCiudad", idCiudad));



            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                command.ExecuteNonQuery();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }

        }

        public static DTCiudad GetCiudad(Int32 idCiudad)
        {

            string selectCommandText = String.Format("SELECT {0} FROM [Ciudad] WHERE [IdCiudad]=@IdCiudad", GetCiudadFields());
            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString" ].ConnectionString);
            }

            SqlDataReader reader;
            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(selectCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(selectCommandText, connection);
            }

            command.Parameters.Add(new SqlParameter("@IdCiudad", idCiudad));


            DTCiudad current = null;

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                reader = command.ExecuteReader();
                if (reader.Read())
                {
                    current = GetCiudadInfo(reader, 0);
                }

                reader.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }
            return current;
        }

        public static List<DTCiudad> ListCiudad()
        {

            List<DTCiudad> toReturn = new List<DTCiudad>();
            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString" ].ConnectionString);
            }
            string selectCommandText = String.Format("SELECT {0} FROM [Ciudad]", GetCiudadFields());
            SqlDataReader reader;
            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(selectCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(selectCommandText, connection);
            }

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    DTCiudad current = GetCiudadInfo(reader, 0);
                    toReturn.Add(current);
                }
                reader.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }
            return toReturn;
        }

        public static string GetCiudadFields()
        {
            return " [Ciudad].[IdCiudad],[Ciudad].[IdPais],[Ciudad].[NombreCiudad],[Ciudad].[LatitudCiudad],[Ciudad].[LongitudCiudad],[Ciudad].[DescripcionCiudad] ";
        }

        public static DTCiudad GetCiudadInfo(SqlDataReader reader, int index)
        {
            DTCiudad current = new DTCiudad();
            object temp;

            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.IdCiudad = (Int32)temp;
            }
            index++;
            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.IdPais = (Int32)temp;
            }
            index++;
            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.NombreCiudad = (String)temp;
            }
            index++;
            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.LatitudCiudad = (String)temp;
            }
            index++;
            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.LongitudCiudad = (String)temp;
            }
            index++;
            temp = reader.GetValue(index);
            if (temp != DBNull.Value)
            {
                current.DescripcionCiudad = (String)temp;
            }
            index++;


            return current;
        }


        public static object CiudadesSegunPais(int idPais)
        {
            List<DTCiudad> toReturn = new List<DTCiudad>();
            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString"].ConnectionString);
            }
            string selectCommandText = String.Format("SELECT {0} FROM [Ciudad] WHERE [IdPais]=@IdPais", GetCiudadFields());
            SqlDataReader reader;
            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(selectCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(selectCommandText, connection);
            }

            command.Parameters.Add(new SqlParameter("@IdPais", idPais));

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    DTCiudad current = GetCiudadInfo(reader, 0);
                    toReturn.Add(current);
                }
                reader.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }
            return toReturn;
        }


        public static List<String> BuscarCiudades(string term)
        {
            List<String> toReturn = new List<String>();
            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString"].ConnectionString);
            }
            // armo un select para buscar la ciudad por el nombre
            string selectCommandText = "select nombrePais + ', ' + nombreCiudad as lugar " + 
            "from ciudad join pais on ciudad.idPais = pais.idPais " +
            "where nombreCiudad like '" + term + "%'";
            SqlDataReader reader;
            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(selectCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(selectCommandText, connection);
            }

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    String current = reader.GetString(0);
                    toReturn.Add(current);
                }
                reader.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }
            return toReturn;            
        }

        /// <summary>
        /// Dado un nombre exacto de una ciudad devuelve una instancia de DTCiudad con todos los datos
        /// o null en caso que no se encuentre
        /// </summary>
        /// <param name="cityName"></param>
        /// <returns></returns>
        public static DTCiudad ObtenerCiudadSegunNombre(string cityName)
        {
            DTCiudad toReturn = null;
            SqlTransaction transaction = TransactionManager.GetTransaction();
            bool useTransaction = (transaction != null);
            SqlConnection connection = null;
            if (!useTransaction)
            {
                connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TorrakDBConnectionString"].ConnectionString);
            }
            // armo un select para buscar la ciudad por el nombre
            string selectCommandText = String.Format("SELECT {0} FROM [Ciudad]", GetCiudadFields());
            selectCommandText += " where nombreCiudad = '" + cityName + "'";
            SqlDataReader reader;
            SqlCommand command;

            if (useTransaction)
            {
                command = new SqlCommand(selectCommandText, transaction.Connection, transaction);
            }
            else
            {
                command = new SqlCommand(selectCommandText, connection);
            }

            try
            {
                if (!useTransaction)
                {
                    connection.Open();
                }
                reader = command.ExecuteReader();
                if (reader.Read())
                {
                    toReturn = GetCiudadInfo(reader, 0);
                }
                reader.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if ((connection != null) && (connection.State == ConnectionState.Open))
                {
                    connection.Close();
                }
            }
            return toReturn;            
        }
        
    }
}